<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // 1.传统方法

    // ES6诞生以前 异步编程的方法 大概有下面四种
    // 回调函数
    // 事件监听
    // 发布/订阅
    // Promise对象

    // Generator函数将JavaScript异步编程带入一个全新阶段


    // 2.基本概念

    // 所谓 异步 就是一个任务不是连续完成的 
    // 可以理解为任务被人为分成两段 先执行第一段 然后转而执行其他任务 等做好了准备 再回过头执行第二段

    // 相应地 连续的执行就叫做同步



    // 回调函数
    // avaScript 语言对异步编程的实现 就是回调函数 
    // 所谓回调函数 就是把任务的第二段单独写在一个函数里面 等到重新执行这个任务的时候 就直接调用这个函数
    // 回调函数的英语名字callback 直译过来就是"重新调用"

    // Promise
    // 回调函数本身并没有问题，它的问题出现在多个回调函数嵌套。
    // Promise 对象就是为了解决这个问题而提出的 它不是新的语法功能 而是一种新的写法 允许将回调函数的嵌套 改成链式调用 
    // Promise 的最大问题是代码冗余 原来的任务被 Promise 包装了一下 不管什么操作 一眼看去都是一堆then 原来的语义变得很不清楚
    
    // Generator函数
    // 协程
    // 传统的编程语言 早有异步编程的解决方案（其实是多任务的解决方案）
    // 其中有一种叫做"协程"（coroutine）意思是多个线程互相协作 完成异步任务
    // - 第一步，协程A开始执行。
    // - 第二步，协程A执行到一半，进入暂停，执行权转移到协程B。
    // - 第三步，（一段时间后）协程B交还执行权。
    // - 第四步，协程A恢复执行。

    // 上面流程的协程A 就是异步任务 因为它分成两段（或多段）执行

    // 举例
    function* asyncJob() {
        // ...其他代码
        var f = yield readFile(fileA);
        // ...其他代码
    }

    // 上面代码的函数asyncJob是一个协程 它的奥妙就在其中的yield命令
    // 它表示执行到此处 执行权将交给其他协程 也就是说 yield命令是异步两个阶段的分界线

    // 协程遇到yield命令就暂停 等到执行权返回 再从暂停的地方继续往后执行
    // 它的最大优点 就是代码的写法非常像同步操作 如果去除yield命令 简直一模一样。


</script>